"""
用户数据模型

定义用户相关的数据库表结构和关系。
包含用户基本信息、认证信息、权限管理等字段。

主要功能：
1. 用户基本信息管理
2. 用户认证和权限控制
3. 用户状态管理
4. 与对话的关系映射

作者: LLM Chat System
版本: 1.0.0
"""

from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.database import Base


class User(Base):
    """
    用户表模型
    
    存储用户的基本信息、认证信息和权限状态。
    支持用户注册、登录、权限管理等功能。
    """
    
    __tablename__ = "users"  # 数据库表名
    
    # ==================== 基本信息字段 ====================
    id = Column(
        Integer, 
        primary_key=True, 
        index=True, 
        comment="用户唯一标识符"
    )
    username = Column(
        String(50), 
        unique=True, 
        index=True, 
        nullable=False, 
        comment="用户名，用于登录和显示"
    )
    email = Column(
        String(100), 
        unique=True, 
        index=True, 
        nullable=False, 
        comment="邮箱地址，用于登录和通知"
    )
    
    # ==================== 认证信息字段 ====================
    password_hash = Column(
        String(255), 
        nullable=False, 
        comment="密码哈希值，存储加密后的密码"
    )
    
    # ==================== 个人信息字段 ====================
    nickname = Column(
        String(100), 
        comment="用户昵称，用于显示"
    )
    avatar = Column(
        String(255), 
        comment="头像URL地址"
    )
    
    # ==================== 状态和权限字段 ====================
    is_active = Column(
        Boolean, 
        default=True, 
        comment="账户是否激活，False表示账户被禁用"
    )
    is_admin = Column(
        Boolean, 
        default=False, 
        comment="是否为管理员，True表示拥有管理员权限"
    )
    
    # ==================== 时间戳字段 ====================
    created_at = Column(
        DateTime(timezone=True), 
        server_default=func.now(), 
        comment="账户创建时间"
    )
    updated_at = Column(
        DateTime(timezone=True), 
        server_default=func.now(), 
        onupdate=func.now(), 
        comment="账户最后更新时间"
    )
    last_login = Column(
        DateTime(timezone=True), 
        comment="最后登录时间"
    )
    
    # ==================== 关系映射 ====================
    # 一对多关系：一个用户可以有多个对话
    conversations = relationship(
        "Conversation", 
        back_populates="user",
        cascade="all, delete-orphan"  # 删除用户时级联删除相关对话
    )
    # 一对一关系：一个用户对应一个设置记录
    settings = relationship(
        "UserSettings", 
        back_populates="user",
        uselist=False,
        cascade="all, delete-orphan"  # 删除用户时级联删除相关设置
    )
    
    # ==================== 关联关系 ====================
    # 与对话的关系（一对多）
    conversations = relationship("Conversation", back_populates="user", cascade="all, delete-orphan")
    
    # 与待办事项的关系（一对多）
    todos = relationship("Todo", back_populates="user", cascade="all, delete-orphan")
    
    # 与MCP会话的关系（一对多）
    mcp_sessions = relationship("MCPSession", back_populates="user", cascade="all, delete-orphan")
    
    def __repr__(self):
        """
        对象的字符串表示
        
        用于调试和日志记录，显示用户的关键信息。
        
        Returns:
            str: 格式化的用户信息字符串
        """
        return f"<User(id={self.id}, username='{self.username}')>"
